package com.bruce.framework.result;

import java.io.Serializable;
import java.util.StringJoiner;

/**
 * 响应信息
 * <br>CreateDate  2021/09/09 10:37:04
 *
 * @author luotuan
 * @version 1.0.0
 */
public class ResponseInfo implements Serializable, Cloneable {
    private static final long serialVersionUID = -3400155092165490278L;

    /**
     * 业务代码
     */
    private final String code;
    /**
     * 业务消息
     */
    private String message;
    /**
     * 系统信息
     */
    private String systemInfo;
    /**
     * 验证信息
     */
    private Object validationInfo;

    /**
     * 系统响应信息
     *
     * @param code       结果代码:业务代码由两位英文字母和四位数字组成，底层框架和公共工具使用SYS开头的代码
     * @param message    业务信息，一般是展现给业务人员看的
     * @param systemInfo 系统信息，一般是展现给开发或运维人员看的
     */
    public ResponseInfo(String code, String message, String systemInfo) {
        super();
        if (code == null) {
            this.code = "";
        } else {
            this.code = code.trim();
        }

        if (message == null) {
            this.message = "";
        } else {
            this.message = message.trim();
        }

        if (systemInfo == null) {
            this.systemInfo = "";
        } else {
            this.systemInfo = systemInfo.trim();
        }
    }

    /**
     * 系统响应信息，code为空
     *
     * @param tips      业务信息，一般是展现给业务人员看的
     * @param debugInfo 系统信息，一般是展现给开发或运维人员看的
     */
    public ResponseInfo(String message, String systemInfo) {
        this(null, message, systemInfo);
    }

    /**
     * 用已有的系统响应信息构建新的系统响应信息并重新指定debug信息
     *
     * @param responseInfo 系统响应信息
     * @param debugInfo    系统信息，一般是展现给开发或运维人员看的
     */
    public ResponseInfo(ResponseInfo responseInfo, String systemInfo) {
        this(responseInfo.getCode(), responseInfo.getMessage(), systemInfo);
    }

    /**
     * @param code           响应编码
     * @param tips           验证提示
     * @param validationInfo 验证详细信息
     */
    public ResponseInfo(String code, String message, Object validationInfo) {
        this.code = code;
        this.message = message;
        this.validationInfo = validationInfo;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof ResponseInfo) {
            ResponseInfo referenceObj = (ResponseInfo) obj;
            if (code.equals(referenceObj.getCode()) && this.getMessage().equals(referenceObj.getMessage()) && systemInfo.equals(referenceObj.getSystemInfo())) {
                return true;
            }
        }
        return false;
    }

    @Override
    public String toString() {
        return new StringJoiner(", ", ResponseInfo.class.getSimpleName() + "[", "]")
                .add("code='" + code + "'")
                .add("message='" + message + "'")
                .add("systemInfo='" + systemInfo + "'")
                .add("validationInfo=" + validationInfo)
                .toString();
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    public String getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }

    public String getSystemInfo() {
        return systemInfo;
    }

    public Object getValidationInfo() {
        return validationInfo;
    }

    public void setValidationInfo(Object validationInfo) {
        this.validationInfo = validationInfo;
    }
}
